Package Question4_5

Source Code of Question4_5.QuestionB

package Question4_5;

import CtCILibrary.AssortedMethods;
import CtCILibrary.TreeNode;

public class QuestionB {
  public static boolean checkBST(TreeNode n, Integer min, Integer max) {
    if (n == null) {
      return true;
    }
    if ((min != null && n.data <= min) || (max != null && n.data > max)) {
      return false;
    }
    if (!checkBST(n.left, min, n.data) ||
      !checkBST(n.right, n.data, max)) {
      return false;
    }
    return true;
  }
   
  public static boolean checkBST(TreeNode n) {
    return checkBST(n, null, null);
  }
 
  public static boolean checkBSTAlternate(TreeNode n) {
    return checkBSTAlternate(n, new IntWrapper(0), new IntWrapper(0));
  }   

  public static boolean checkBSTAlternate(TreeNode n, IntWrapper min, IntWrapper max) {
    /* An alternate, less clean approach. This is not provided in the book, but is used to test the other method. */
    if (n.left == null) {
      min.data = n.data;
    } else {
      IntWrapper leftMin = new IntWrapper(0);
      IntWrapper leftMax = new IntWrapper(0);
      if (!checkBSTAlternate(n.left, leftMin, leftMax)) {
        return false;
      }
      if (leftMax.data > n.data) {
        return false;
      }
      min.data = leftMin.data;
    }
    if (n.right == null) {
      max.data = n.data;
    } else {
      IntWrapper rightMin = new IntWrapper(0);
      IntWrapper rightMax = new IntWrapper(0);
      if (!checkBSTAlternate(n.right, rightMin, rightMax)) {
        return false;
      }
      if (rightMin.data <= n.data) {
        return false;
      }
      max.data = rightMax.data;
    }
    return true;
  }

  /* Create a tree that may or may not be a BST */
  public static TreeNode createTestTree() {
    /* Create a random BST */
    TreeNode head = AssortedMethods.randomBST(10, -10, 10);
   
    /* Insert an element into the BST and potentially ruin the BST property */
    TreeNode node = head;
    do {
      int n = AssortedMethods.randomIntInRange(-10, 10);
      int rand = AssortedMethods.randomIntInRange(0, 5);
      if (rand == 0) {
        node.data = n;
      } else if (rand == 1) {
        node = node.left;
      } else if (rand == 2) {
        node = node.right;
      } else if (rand == 3 || rand == 4) {
        break;
      }
    } while (node != null)
   
    return head;
  }
 
  public static void main(String[] args) {
    /* Simple test -- create one */
    int[] array = {Integer.MIN_VALUE, 3, 5, 6, 10, 13, 15, Integer.MAX_VALUE};
    TreeNode node = TreeNode.createMinimalBST(array);
    //node.left.data = 6; // "ruin" the BST property by changing one of the elements
    node.print();
    boolean isBst = checkBST(node);
    System.out.println(isBst);
   
    /* More elaborate test -- creates 100 trees (some BST, some not) and compares the outputs of various methods. */
    /*for (int i = 0; i < 100; i++) {
      TreeNode head = createTestTree();
     
      // Compare results
      boolean isBst1 = checkBST(head);
      boolean isBst2 = checkBSTAlternate(head);
     
      if (isBst1 != isBst2) {
        System.out.println("*********************** ERROR *******************");
        head.print();
        break;
      } else {
        System.out.println(isBst1 + " | " + isBst2);
        head.print();
      }
    }*/
  }
}
 
TOP

Related Classes of Question4_5.QuestionB

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.